package com.javaee.wordtree.service;

import com.javaee.wordtree.entity.RagResponse;
import com.javaee.wordtree.entity.User;

import java.util.List;

/**
 * Prompt生成器类 - 使用Builder设计模式构建复杂的prompt
 */
public class PromptBuilder {
    
    private StringBuilder promptBuilder;
    private String userInput;
    private String userLabel;
    private List<RagResponse.RagResult> ragResults;
    private boolean hasRagResults;
    
    private PromptBuilder() {
        this.promptBuilder = new StringBuilder();
    }
    
    /**
     * 创建新的Prompt生成器
     * @return PromptBuilder实例
     */
    public static PromptBuilder create() {
        return new PromptBuilder();
    }
    
    /**
     * 设置用户输入
     * @param userInput 用户问题
     * @return this
     */
    public PromptBuilder withUserInput(String userInput) {
        this.userInput = userInput;
        return this;
    }
    
    /**
     * 设置用户书籍类型标签
     * @param userBookType 用户书籍类型标签
     * @return this
     */
    public PromptBuilder withUserLabel(String userBookType) {
        this.userLabel = userBookType;
        return this;
    }
    
    /**
     * 设置RAG检索结果
     * @param ragResults RAG检索结果列表
     * @return this
     */
    public PromptBuilder withRagResults(List<RagResponse.RagResult> ragResults) {
        this.ragResults = ragResults;
        this.hasRagResults = ragResults != null && !ragResults.isEmpty();
        return this;
    }
    
    /**
     * 构建完整的prompt
     * @return 构建好的prompt字符串
     */
    public String build() {
        if (hasRagResults) {
            return buildWithRagResults();
        } else {
            return buildWithoutRagResults();
        }
    }
    
    /**
     * 构建有RAG结果的prompt
     * @return prompt字符串
     */
    private String buildWithRagResults() {
        promptBuilder.setLength(0); // 重置StringBuilder
        
        // 基础角色设定
        promptBuilder.append("你是一名专业的英语教师，请严格参考下列相关问答内容，结合所有提供的信息，详细、准确地用中文回答用户的问题。\n");
        
        // 添加用户信息（如果有）
        appendUserInfo();
        
        // 添加指导原则
        promptBuilder.append("请确保答案紧密结合查找到的问答内容，不要凭空编造信息。\n");
        promptBuilder.append("如有多个答案或不同观点，请综合整理并说明。\n");
        
        // 添加用户目标相关指导（如果有）
        // appendUserTargetGuidance();
        
        promptBuilder.append("请注意，answer字段是确认的最佳答案，otherAnswers字段包含所有其他回答，应优先考虑最佳答案的内容。\n\n");
        
        // 添加RAG结果内容
        appendRagResults();
        
        // 添加用户问题
        appendUserQuestion();
        
        // 添加最终指导
        promptBuilder.append("请基于上述内容，生成详细、准确、有教学意义的中文答案，答案必须紧扣查找到的内容。");
        promptBuilder.append("如果检索到的内容与用户问题高度相关，请直接利用最佳答案和其他回答生成综合性回复；");
        promptBuilder.append("如果检索到的内容与用户问题相关度不高，请明确说明，并尽可能提供一些相关的英语知识。");
        
        return promptBuilder.toString();
    }
    
    /**
     * 构建无RAG结果的prompt
     * @return prompt字符串
     */
    private String buildWithoutRagResults() {
        promptBuilder.setLength(0); // 重置StringBuilder
        
        // 基础角色设定
        promptBuilder.append("你是一名专业的英语教师，用户向你提问了一个英语相关的问题。\n");
        
        // 添加用户信息（如果有）
        appendUserInfo();
        
        // 说明知识库情况
        // promptBuilder.append("很遗憾，在知识库中没有找到与用户问题直接相关的问答内容。\n");
        promptBuilder.append("请基于你的英语教学专业知识，尽可能详细、准确地用中文回答用户的问题。\n");
        
        // 添加用户目标相关指导（如果有）
        // appendUserTargetGuidance();
        
        promptBuilder.append("如果问题超出了英语学习范围，请礼貌地说明并引导用户提问英语相关问题。\n\n");
        
        // 添加用户问题
        appendUserQuestion();
        
        promptBuilder.append("请提供一个专业、有教学价值的回答，即使没有具体的参考资料，也要尽力帮助用户解决英语学习问题。");
        
        return promptBuilder.toString();
    }
    
    /**
     * 添加用户信息（如果有标签）
     */
    private void appendUserInfo() {
        if (userLabel != null && !userLabel.isEmpty()) {
            promptBuilder.append("用户信息：").append(userLabel).append("\n");
        }
    }
    
    /**
     * 添加用户目标相关指导（如果有标签）
     * 暂时没有使用，保留以备将来扩展
     * 例如：如果用户有特定的学习目标或需求，可以在这里添加相关指导
     */
    private void appendUserTargetGuidance() {
        if (userLabel != null && !userLabel.isEmpty()) {
            promptBuilder.append("请根据用户的学习目标，提供针对性的建议和解答。\n");
        }
    }
    
    /**
     * 添加RAG检索结果内容
     */
    private void appendRagResults() {
        if (ragResults == null || ragResults.isEmpty()) {
            return;
        }
        
        for (int i = 0; i < ragResults.size(); i++) {
            RagResponse.RagResult result = ragResults.get(i);
            promptBuilder.append("【相关问答 ").append(i + 1).append("】\n");
            promptBuilder.append("Q: ").append(result.getQuestion()).append("\n");
            promptBuilder.append("A (最佳回答): ").append(result.getAnswer()).append("\n");
            
            // 添加其他答案（如果有且不重复）
            appendOtherAnswers(result);
            
            promptBuilder.append("相似度: ").append(String.format("%.2f", result.getSimilarity())).append("\n\n");
        }
    }
    
    /**
     * 添加其他答案内容
     * @param result RAG结果
     */
    private void appendOtherAnswers(RagResponse.RagResult result) {
        if (result.getOtherAnswers() != null && !result.getOtherAnswers().isEmpty()) {
            promptBuilder.append("其他回答摘要: \n");
            for (String otherAnswer : result.getOtherAnswers()) {
                if (!otherAnswer.equals(result.getAnswer())) {
                    // 截断过长的回答
                    String shortAnswer = otherAnswer.length() > 200 
                        ? otherAnswer.substring(0, 200) + "..."
                        : otherAnswer;
                    promptBuilder.append("- ").append(shortAnswer).append("\n");
                }
            }
        }
    }
    
    /**
     * 添加用户问题
     */
    private void appendUserQuestion() {
        promptBuilder.append("【用户问题】：").append(userInput).append("\n\n");
    }
}
